#include "Log.hpp"
#include"ThreadPool.hpp"
#include"Task.hpp"
#include<memory>
using namespace ThreadPoolModule;

//1.创建线程池对象的智能指针，参数是绑定task_t = std::function<void(std::string name)>的Hander任务，在线程池对象初始化时传入任务，并根据条件进行线程处理任务等待
//2.线程池启动，将所有线程调用线程封装好的线程启动，初始化各种参数，调用Routine方法通过_func获得Hander的参数
//3.所有线程等待任务来临并执行，通过Equeue添加任务（当前为Push),基于生产消费模型，唤醒条件变量下的线程
//4.执行完任务停止线程运行
//5.等待线程回收，线程池运行完毕

int main()
{
    ENABLE_CONSOLE();
    // Enable_File();

    std::unique_ptr<ThreadPool<task_t>> tp = std::make_unique<ThreadPool<task_t>>();
    tp->Start();

    int cnt = 10;
    while(cnt--)
    {
        //函数指针（或函数名）可以隐式转换成 std::function<...> 对象，但只能产生一个“临时量”
        //把 const std::function<...> 放进了 std::queue，而 std::queue 的底层容器 std::deque 要求元素类型必须是「非 const、非 volatile」的。
        tp->Equeue(Push);
        sleep(1);
    }

    tp->Stop();
    sleep(3);
    tp->Wait();
    
    return 0;
}